Silme işlemi için önce arama yapılmalıdır; silinecek
düğümden bir öncesi belirlenir ve silinmek istenen düğümün bağlantısı
koparılarak aradan çıkarılır. Tek yönlü bağlantılı listede geriye doğru
hareket yapılamadığı için bir önceki düğümün adresini öğrenmek mümkün
olmaz. Bu nedenle burada verilen silme işleminde arama da vardır. Aşağıda
silme işlemi algoritması kaba-kodu ve Fonksiyon-6.4.'de C dilindeki karşılığı
verilmiştir.
Bağlantılı Liste Üzerinde Silme Algoritması
Kaba-Kodu
p ilk <- (listenin başını gösteren adres p
işaretçisine alınır); 1 while(p NULL){
silinmek
istenen düğümün ve
birönceki
düğümün adresini bul;
}
if( silinmek istenen listede varsa ){
if(silinmek istenen
ilk düğüm ise) { 2 if(
listede bir düğüm varsa)
ilk
ve son NULL;
else
ilk=ilk->arka;
}
else { 3 silinmek
isteneni aradan çıkart
(silinenin
bağlantılarını kopar ve
yeni
bağlantıları yap)
} 4 free(silinen bellekte işgal ettiği bellek
alanı);
}
else
silinmek istenen listede yok!
Yukarıdaki kaba-kodda görüldüğü gibi, önce silinen aranmaktadır;
silinmesi istenen ve bir önceki düğümün adresleri bulunmakta ve silinmesi
istenen aradan çıkarılmaktadır. Dikkat edilirse silinmesi istenen halıhazırda
ilk düğüm ise ayrı, aradan bir düğüm ise ayrı kod yürütülmektedir. Düğüm
silindikten sonra işgal ettiği bellek alanı serbest bırakılır.
Fonksiyon-6.3. Bağlantılı listede arama ( tek yönlü)
while(p) { /*
silinecek olan aranıyor... */
if(silinecek==p->bilgi)
break;
bironceki=p;
p=p->arka;
} /* silinecek listede
varsa o ve bir önceki bulundu */
if(p!=NULL) {
if(bironceki==NULL)
{ /* silinecek olan birinci düğüm! */
if(ilk==son)
{ /* listede yalnızca 1 düğüm varsa */
ilk=NULL;
son=NULL;
}
else
ilk=ilk->arka;
}
else { /* silinecek olan aradan bir düğüm
*/
bironceki->arka=p->arka;
if(bironceki->arka==NULL)
son=bironceki;
/*silinen son düğüm */
}
free(p); /* alan serbest
bırakılıyor */
return p; /* NULL'dan farklı
adres gönderiliyor */
}
else
return NULL; /* silinmek
istenen listede yok */